
Adélia Cruz
Neural Network Developer

Otomasi web telah menjadi esensial untuk pengumpulan data, pengujian, dan berbagai operasi bisnis. Namun, situs web modern menggunakan langkah anti-bot yang canggih dan CAPTCHA yang dapat menghentikan bahkan skrip otomasi yang dirancang dengan hati-hati.
Kombinasi DrissionPage dan CapSolver memberikan solusi yang kuat untuk tantangan ini:
Bersama, alat-alat ini memungkinkan otomasi web yang mulus yang melewati deteksi WebDriver dan tantangan CAPTCHA.
Panduan ini akan membantu Anda mencapai tiga tujuan inti:
DrissionPage adalah alat otomasi web berbasis Python yang menggabungkan kemampuan kontrol browser dengan permintaan HTTP. Berbeda dengan Selenium, alat ini menggunakan kernel yang dikembangkan sendiri yang tidak bergantung pada WebDriver, sehingga lebih sulit dideteksi.
# Instal DrissionPage
pip install DrissionPage
# Instal perpustakaan requests untuk API CapSolver
pip install requests
from DrissionPage import ChromiumPage
# Buat instance browser
page = ChromiumPage()
# Navigasi ke URL
page.get('https://wikipedia.org')
# Temukan dan interaksi dengan elemen
page('#search-input').input('Hello World')
page('#submit-btn').click()
CapSolver adalah layanan penyelesaian CAPTCHA otomatis berbasis AI yang mendukung berbagai jenis CAPTCHA. Menyediakan API yang sederhana yang memungkinkan Anda mengirim tantangan CAPTCHA dan menerima solusi dalam hitungan detik.
https://api.capsolver.comhttps://api-stable.capsolver.comSebelum menggabungkan DrissionPage dengan CapSolver, otomasi web menghadapi beberapa masalah:
| Tantangan | Dampak |
|---|---|
| Deteksi WebDriver | Skrip Selenium langsung diblokir |
| Tantangan CAPTCHA | Memerlukan penyelesaian manual, menghentikan otomasi |
| Kompleksitas iframe | Sulit berinteraksi dengan konten bersarang |
| Operasi Multi-tab | Memerlukan logika beralih tab yang rumit |
Integrasi DrissionPage + CapSolver menyelesaikan semua tantangan ini dalam satu alur kerja.
Metode integrasi API memberi Anda kontrol penuh atas proses penyelesaian CAPTCHA dan bekerja dengan semua jenis CAPTCHA.
pip install DrissionPage requests
import time
import requests
from DrissionPage import ChromiumPage
CAPSOLVER_API_KEY = "KUNCI_API_ANDA"
CAPSOLVER_API = "https://api.capsolver.com"
def create_task(task_payload: dict) -> str:
"""Buat tugas penyelesaian CAPTCHA dan kembalikan ID tugas."""
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": task_payload
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Kesalahan CapSolver: {result.get('errorDescription')}")
return result["taskId"]
def get_task_result(task_id: str, max_attempts: int = 120) -> dict:
"""Poll hasil tugas hingga selesai atau timeout."""
for _ in range(max_attempts):
response = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
return result["solution"]
elif result.get("status") == "failed":
raise Exception(f"Tugas gagal: {result.get('errorDescription')}")
time.sleep(1)
raise TimeoutError("Penyelesaian CAPTCHA timeout")
def solve_captcha(task_payload: dict) -> dict:
"""Selesaikan alur kerja penyelesaian CAPTCHA."""
task_id = create_task(task_payload)
return get_task_result(task_id)
Anda juga dapat menggunakan ekstensi CapSolver dengan DrissionPage untuk pendekatan yang lebih sederhana.
config.js ekstensi:// Di folder ekstensi, edit: assets/config.js
var defined = {
apiKey: "KUNCI_API_ANDA", // Ganti dengan kunci API Anda yang sebenarnya
enabledForBlacklistControl: false,
blackUrlList: [],
enabledForRecaptcha: true,
enabledForRecaptchaV3: true,
enabledForTurnstile: true,
// ... pengaturan lainnya
}
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.add_extension('/path/to/capsolver-extension')
page = ChromiumPage(co)
# Ekstensi akan secara otomatis mendeteksi dan menyelesaikan CAPTCHA
Catatan: Ekstensi harus memiliki kunci API yang valid sebelum dapat menyelesaikan CAPTCHA secara otomatis.
Cloudflare Turnstile adalah salah satu tantangan CAPTCHA yang paling umum. Berikut cara menyelesaikannya:
import time
import requests
from DrissionPage import ChromiumPage
CAPSOLVER_API_KEY = "KUNCI_API_ANDA"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_turnstile(site_key: str, page_url: str) -> str:
"""Selesaikan Cloudflare Turnstile dan kembalikan token."""
# Buat tugas
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Kesalahan: {result.get('errorDescription')}")
task_id = result["taskId"]
# Poll hasil
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
elif result.get("status") == "failed":
raise Exception(f"Gagal: {result.get('errorDescription')}")
time.sleep(1)
def main():
target_url = "https://situs-target-anda.com"
turnstile_site_key = "0x4XXXXXXXXXXXXXXXXX" # Temukan ini di sumber halaman
# Buat instance browser
page = ChromiumPage()
page.get(target_url)
# Tunggu Turnstile dimuat
page.wait.ele_displayed('input[name="cf-turnstile-response"]', timeout=10)
# Selesaikan CAPTCHA
token = solve_turnstile(turnstile_site_key, target_url)
print(f"Dapatkan token Turnstile: {token[:50]}...")
# Masukkan token menggunakan JavaScript
page.run_js(f'''
document.querySelector('input[name="cf-turnstile-response"]').value = "{token}";
// Juga aktifkan callback jika ada
const callback = document.querySelector('[data-callback]');
if (callback) {{
const callbackName = callback.getAttribute('data-callback');
if (window[callbackName]) {{
window[callbackName]('{token}');
}}
}}
''')
# Kirim formulir
page('button[type="submit"]').click()
page.wait.load_start()
print("Berhasil melewati Turnstile!")
if __name__ == "__main__":
main()
Contoh ini secara otomatis mendeteksi kunci situs dari halaman - tidak perlu konfigurasi manual:
import time
import requests
from DrissionPage import ChromiumPage, ChromiumOptions
CAPSOLVER_API_KEY = "KUNCI_API_ANDA"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_recaptcha_v2(site_key: str, page_url: str) -> str:
"""Selesaikan reCAPTCHA v2 dan kembalikan token."""
# Buat tugas
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Kesalahan: {result.get('errorDescription')}")
task_id = result["taskId"]
print(f"Tugas dibuat: {task_id}")
# Poll hasil
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
elif result.get("status") == "failed":
raise Exception(f"Gagal: {result.get('errorDescription')}")
time.sleep(1)
def main():
# Cukup berikan URL - kunci situs akan dideteksi otomatis
target_url = "https://www.google.com/recaptcha/api2/demo"
# Konfigurasi browser
co = ChromiumOptions()
co.set_argument('--disable-blink-features=AutomationControlled')
print("Memulai browser...")
page = ChromiumPage(co)
try:
page.get(target_url)
time.sleep(2)
# Deteksi kunci situs secara otomatis dari halaman
recaptcha_div = page('.g-recaptcha')
if not recaptcha_div:
print("Tidak menemukan reCAPTCHA di halaman!")
return
site_key = recaptcha_div.attr('data-sitekey')
print(f"Kunci situs terdeteksi otomatis: {site_key}")
# Selesaikan CAPTCHA
print("Menyelesaikan reCAPTCHA v2...")
token = solve_recaptcha_v2(site_key, target_url)
print(f"Dapatkan token: {token[:50]}...")
# Masukkan token
page.run_js(f'''
var responseField = document.getElementById('g-recaptcha-response');
responseField.style.display = 'block';
responseField.value = '{token}';
''')
print("Token dimasukkan!")
# Kirim formulir
submit_btn = page('#recaptcha-demo-submit') or page('input[type="submit"]') or page('button[type="submit"]')
if submit_btn:
submit_btn.click()
time.sleep(3)
print("Formulir dikirim!")
print(f"URL saat ini: {page.url}")
print("SUCCES!")
finally:
page.quit()
if __name__ == "__main__":
main()
Uji sendiri:
python recaptcha_demo.py
Ini akan membuka halaman demo reCAPTCHA Google, secara otomatis mendeteksi kunci situs, menyelesaikan CAPTCHA, dan mengirim formulir.
reCAPTCHA v3 berbasis skor dan tidak memerlukan interaksi pengguna. Anda perlu menentukan parameter aksi.
import time
import requests
from DrissionPage import ChromiumPage, ChromiumOptions
CAPSOLVER_API_KEY = "KUNCI_API_ANDA"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_recaptcha_v3(
site_key: str,
page_url: str,
action: str = "verify",
min_score: float = 0.7
) -> str:
"""Selesaikan reCAPTCHA v3 dengan aksi dan skor minimum yang ditentukan."""
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
"pageAction": action,
"minScore": min_score
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Kesalahan: {result.get('errorDescription')}")
task_id = result["taskId"]
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
elif result.get("status") == "failed":
raise Exception(f"Gagal: {result.get('errorDescription')}")
time.sleep(1)
def main():
target_url = "https://situs-target-anda.com"
recaptcha_v3_key = "6LcXXXXXXXXXXXXXXXXXXXXXXXXX"
# Setup browser headless untuk v3
co = ChromiumOptions()
co.headless()
page = ChromiumPage(co)
page.get(target_url)
# Selesaikan reCAPTCHA v3 dengan aksi "search"
print("Menyelesaikan reCAPTCHA v3...")
token = solve_recaptcha_v3(
recaptcha_v3_key,
target_url,
action="search",
min_score=0.9 # Minta skor tinggi
)
# Jalankan callback dengan token
page.run_js(f'''
// Jika ada fungsi callback, panggil dengan token
if (typeof onRecaptchaSuccess === 'function') {{
onRecaptchaSuccess('{token}');
}}
// Atau atur nilai bidang tersembunyi
var responseField = document.querySelector('[name="g-recaptcha-response"]');
if (responseField) {{
responseField.value = '{token}';
}}
''')
print("reCAPTCHA v3 berhasil dihindari!")
if __name__ == "__main__":
main()
DrissionPage menyediakan rantai tindakan untuk interaksi mouse dan keyboard yang alami:
import time
import random
from DrissionPage import ChromiumPage
from DrissionPage.common import Keys, Actions
def human_delay():
"""Penundaan acak untuk meniru perilaku manusia."""
time.sleep(random.uniform(0.5, 1.5))
def main():
page = ChromiumPage()
page.get('https://your-target-site.com/form')
# Gunakan rantai tindakan untuk interaksi menyerupai manusia
ac = Actions(page)
# Gerakkan ke bidang input secara alami, lalu klik dan ketik
ac.move_to('input[name="email"]').click()
human_delay()
# Ketik perlahan seperti manusia
for char in "user@email.com":
ac.type(char)
time.sleep(random.uniform(0.05, 0.15))
human_delay()
# Gerakkan ke bidang kata sandi
ac.move_to('input[name="password"]').click()
human_delay()
# Ketik kata sandi
page('input[name="password"]').input("mypassword123")
# Setelah menyelesaikan CAPTCHA, klik submit dengan gerakan alami
ac.move_to('button[type="submit"]')
human_delay()
ac.click()
if __name__ == "__main__":
main()
Konfigurasikan DrissionPage agar terlihat seperti browser biasa:
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_argument('--disable-blink-features=AutomationControlled')
co.set_argument('--no-sandbox')
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
# Atur ukuran layar ke resolusi umum
co.set_argument('--window-size=1920,1080')
page = ChromiumPage(co)
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.incognito() # Gunakan mode incognito
co.headless() # Jalankan headless (untuk CAPTCHA v3)
page = ChromiumPage(co)
Hindari memicu pembatasan kecepatan dengan menambahkan penundaan acak:
import random
import time
def human_delay(min_sec=1.0, max_sec=3.0):
"""Penundaan acak untuk meniru perilaku manusia."""
time.sleep(random.uniform(min_sec, max_sec))
# Gunakan antara tindakan
page('#button1').click()
human_delay()
page('#input1').input('text')
Selalu implementasikan penanganan kesalahan untuk penyelesaian CAPTCHA:
def solve_with_retry(task_payload: dict, max_retries: int = 3) -> dict:
"""Menyelesaikan CAPTCHA dengan logika retry."""
for attempt in range(max_retries):
try:
return solve_captcha(task_payload)
except TimeoutError:
if attempt < max_retries - 1:
print(f"Timeout, mencoba lagi... ({attempt + 1}/{max_retries})")
time.sleep(5)
else:
raise
except Exception as e:
if "balance" in str(e).lower():
raise # Jangan retry untuk kesalahan balance
if attempt < max_retries - 1:
time.sleep(2)
else:
raise
Gunakan proxy dengan DrissionPage untuk rotasi IP:
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_proxy('http://username:password@proxy.example.com:8080')
page = ChromiumPage(co)
Integrasi DrissionPage dan CapSolver menciptakan alat yang kuat untuk otomatisasi web:
Baik Anda membangun web scraper, sistem pengujian otomatis, atau pipeline pengumpulan data, kombinasi ini memberikan keandalan dan ketangkasan yang Anda butuhkan.
Bonus: Gunakan kode
DRISSIONsaat mendaftar di CapSolver untuk menerima kredit bonus!
DrissionPage tidak menggunakan WebDriver, yang berarti:
CapSolver mendukung semua jenis CAPTCHA utama. Cloudflare Turnstile dan reCAPTCHA v2/v3 memiliki tingkat keberhasilan tertinggi. Integrasi ini berjalan lancar dengan semua CAPTCHA yang didukung oleh CapSolver.
Ya! DrissionPage mendukung mode headless. Untuk reCAPTCHA v3 dan CAPTCHA berbasis token, mode headless bekerja sempurna. Untuk CAPTCHA v2 yang terlihat, mode headless mungkin memberikan hasil yang lebih baik.
Cari di sumber halaman untuk:
data-sitekey atau elemen cf-turnstiledata-sitekey pada div g-recaptchaSolusi umum:
Ya! DrissionPage memiliki dukungan bawaan untuk elemen shadow DOM melalui kelas ChromiumShadowElement.
Pelajari arsitektur pengambilan data web Rust yang dapat diskalakan dengan reqwest, scraper, pengambilan data asinkron, pengambilan data browser tanpa tampilan, rotasi proxy, dan penanganan CAPTCHA yang sesuai aturan.

Mengotomasi penyelesaian CAPTCHA dengan Nanobot dan CapSolver. Gunakan Playwright untuk menyelesaikan reCAPTCHA dan Cloudflare secara otomatis.
